接續之前的內容,今天要來訓練昨天搭建好的模型,將圖跟標籤送進去,我們從訓練集裡分出0.1即10%的資料當作驗證集,之後會討論到為何使用驗證集,參與訓練的圖片剩餘54000張,每32張就更新一次,稱作一輪,跑完20輪,我們會對隨機的初始權重進行54000/32X20=33760次的更新。
這裡使用小批量梯度下降,可以加速收斂,每讀取32張圖片就更新一次權重,我們使用的方法折衷兼顧了速度跟穩定,讀完所有圖片才更新一次權重,需要花相當多的時間跑非常多輪,也不建議讀取一張圖片就更新一次權重,只參考一張圖片就更新不穩定,容易受到極端值的影響,且更花時間,僅跑一輪我們就得把50240個權重更新54000次。
model.fit(
x = x_train,
y = y_train,
batch_size = 32,
epochs = 20,
validation_split = 0.1,
verbose = 2
)
訓練經過一定的輪數後,你可能會發現訓練集的loss跟accuracy在上下跳動,參照資料的預處理篇看到的圖,模型並不會比筆直朝低處去,也不會在低處停下,而是圍繞的低點打轉,把批大小從32改成圖片集的數量54000,你便可以看到數值穩定下降,但是你必須把epochs改得相當大,這也驗證了前面所說的內容。
訓練完成之後可以先保存模型,之後有需要用的時候就可以直接載入。
model.save('mnist_model.h5')
接著查看模型在測試集上的表現。
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])